package first

import "gitee.com/themoonstone/toOffer/first/original"

/*
	输入一个链表，输出该链表中倒数第k个节点。为了符合大多数人的习惯，本题从1开始计数，即链表的尾节点是倒数第1个节点。例如，一个链表有6个节点，从头节点开始，它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。

	示例：

	给定一个链表: 1->2->3->4->5, 和 k = 2.

	返回链表 4->5.
	https://leetcode-cn.com/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof/submissions/
*/
var count int = 0
var node *original.ListNode
func getKthFromEnd(head *original.ListNode, k int) *original.ListNode {
	getK(head, k)
	return node
}

func getK(cur *original.ListNode, k int)  {
	if nil == cur {
		return
	}
	getKthFromEnd(cur.Next, k)
	count++
	if count == k {
		node = cur
		return
	}

}

/*
	要求链表中的倒数第k个节点、也就是从头指针开始的n-k+1个节点
	给定两个指针fast, slow,fast向前移动k-1步、此时fast距离尾部节点为n-k+1
	同时移动fast,slow、在fast移动到尾部节点时、slow刚好走了n-k+1将、此时slow所指向的节点即表示倒数第k个节点
*/
func getKthFromEnd1(head *original.ListNode, k int) *original.ListNode {
	fast, slow := head, head
	for i := 1;i<k;i++ {
		fast = fast.Next
	}
	for fast.Next != nil {
		fast = fast.Next
		slow = slow.Next
	}
	return slow
}